///|/|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*
//|/|*     Nyterave animation ball script!   *
//|/|*           FREE TO USE V2.1            * 
//|/|*        by Sitting Lightcloud          *
//|/|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|/
// Modified by Tursi for surprise sky sits ;)

// name of the only allowed sitter
string legalsit="Tursi Jackson";

// default position (copy the world coordinates)
vector origpos=<243.62640, 207.87880, 136.66570>;

// how far up to send the victim ;)
vector offset=<0.0, 0.0, 3500.0>;

// position to sit on the ball e.g <0.0, 0.0, 0.43>
vector POSITION=<0.0, 0.0,0.4>;

string animation;

float timeout = 10.0;

hide_me()
{
    llSetAlpha(0.0, ALL_SIDES);
    llSetText("",<0,0,0>,0.0);     
}

moveto(vector target) {
    // only needed if we can't move more then 55m, I think it's okay
//    while (llVecDist(llGetRootPosition(), target) > 50.0) {
//        vector newpos=(llVecNorm(target-llGetRootPosition())*45.0)+llGetRootPosition();
//        if (llGetNumberOfPrims() > 0) {
//            llSetLinkPrimitiveParamsFast(1, [PRIM_POSITION, newpos]);   // root
//        } else {
//            llSetLinkPrimitiveParamsFast(0, [PRIM_POSITION, newpos]);   // unlinked
//        }            
//        llOwnerSay((string)newpos);
//    }
     
    while (llVecDist(llGetRootPosition(), target) > 1.0) {
        // this is needed because the prim to move changes when someone is sitting!
        if (llGetNumberOfPrims() > 1) {
            llSetLinkPrimitiveParamsFast(1, [PRIM_POSITION, target]);   // root
        } else {
            llSetLinkPrimitiveParamsFast(0, [PRIM_POSITION, target]);   // unlinked
        }            
//        llOwnerSay((string)target+ "!");
    }
}


default 
{
    state_entry() 
    {
        llSitTarget(POSITION, ZERO_ROTATION); 
//        llOwnerSay("going home");
        moveto(origpos);
        hide_me();
    }
    
    on_rez(integer r)
    {
        llResetScript();
    }
    
    changed(integer change) 
    { 
        if (change & CHANGED_LINK) 
        {
            key av = llAvatarOnSitTarget();
               
            if (av != NULL_KEY) 
            { 
                llRequestPermissions(av, PERMISSION_TRIGGER_ANIMATION);
                if (llKey2Name(av) != legalsit) {
//                    llOwnerSay("bad sit!");
                    moveto(origpos+offset);
                    llSetTimerEvent(timeout);
                } else {
//                    llOwnerSay("good sit.");
                }
            }
            else
            {
//                llOwnerSay("stand up");
                llSetTimerEvent(0.0);
                moveto(origpos);
                integer perm=llGetPermissions();
                if ((perm & PERMISSION_TRIGGER_ANIMATION) && (llStringLength(animation)>0)) {       
                    llStopAnimation(animation);
                }
                animation="";
            }
        }
    }
    run_time_permissions(integer perm)
    {
        if (perm & PERMISSION_TRIGGER_ANIMATION)
        {
            llStopAnimation("sit");
            animation=llGetInventoryName(INVENTORY_ANIMATION,0);
            llStartAnimation(animation);
        }
    }

    timer() {
//        llOwnerSay("timeout!");
        llSetTimerEvent(0.0);
        key av = llAvatarOnSitTarget();
        if (av != NULL_KEY) {
            llUnSit(av);
        }
        moveto(origpos);
    }        
}
